Estoy familiarizado con NaN
siendo "raro" en JavaScript, es decir, NaN === NaN
siempre devuelve false
, como se describe aquí . Por lo tanto, no se deben hacer comparaciones ===
para verificar NaN
, sino usar isNaN(..) en su lugar.
Así que me sorprendió descubrir que
> [NaN].includes(NaN) true
Esto parece inconsistente. ¿Por qué tener este comportamiento?
¿Cómo funciona? ¿El método includes
comprueba específicamente isNaN
?
Según el documento de MDN dice que
Nota: Técnicamente hablando, include
includes()
usa el algoritmosameValueZero
para determinar si se encuentra el elemento dado.
const x = NaN, y = NaN; console.log(x == y); // false -> using 'loose' equality console.log(x === y); // false -> using 'strict' equality console.log([x].indexOf(y)); // -1 (false) -> using 'strict' equality console.log(Object.is(x, y)); // true -> using 'Same-value' equality console.log([x].includes(y)); // true -> using 'Same-value-zero' equality
Object.is()
y ===
está en su tratamiento de los ceros con signo y los NaN.El método .includes()
usa el algoritmo SameValueZero
para verificar la igualdad de dos valores y considera que el valor de NaN
es igual a sí mismo.
El algoritmo SameValueZero
es similar a SameValue
, pero la única diferencia es que el algoritmo SameValueZero
considera que +0
y -0
son iguales.
El método Object.is()
usa SameValue
y devuelve verdadero para NaN
.
console.log(Object.is(NaN, NaN));
El comportamiento del método .includes()
es ligeramente diferente del método .indexOf()
; el método .indexOf()
usa una comparación de igualdad estricta para comparar valores y la comparación de igualdad estricta no considera que NaN
sea igual a sí mismo.
console.log([NaN].indexOf(NaN));
Puede encontrar información sobre diferentes algoritmos de verificación de igualdad en MDN: